import { QueryOptionsDto } from '@/types/common/dto/query.options.dto';
import { QueryListVo } from '@/types/common/vo/query.list.vo';
import { LcDocument, LcDocumentBackup, LcProject } from './editor.type';
import { ITypeEntity } from '../../superType/types';
import { BelongType } from './resource.dto';

/**
 * 比较模式
 */
export enum CompareMode {
  /** 双向比较 */
  BIDIRECTIONAL = 'BIDIRECTIONAL',
  /** 仅比较指定文件 */
  SPECIFIED_FILES = 'SPECIFIED_FILES',
  /** 单向拉取（用于模块安装等场景） */
  UNIDIRECTIONAL = 'UNIDIRECTIONAL',
}

export class ApiEditorPutDocumentDto extends LcDocument {
  // 现在的问题是  集成自文件里  swagger 插件没有读取到
}

export class ApiEditorSaveDto extends LcProject {
  // 现在的问题是  集成自文件里  swagger 插件没有读取到
}

export class ApiEditorGetReqDto extends QueryOptionsDto {
  /** 项目ID */
  projectId?: string;

  /** 使用ID获取 */
  _id?: string;

  /** 使用IDS获取 */
  _ids?: string[];

  /** 根据文件名获取指定页面 */
  fileName?: string;

  /** 根据文件名获取指定页面（多） */
  fileNames?: string[];

  /** 文件夹 */
  folders?: string[];

  /** 根据文档ID获取 */
  documentId?: string;

  /** 团队ID */
  teamId?: number;

  /** 仅返回某个时间点更新后的文档 */
  afterTime?: number;

  /** 关键词 */
  keywords?: string;

  /** 框架 */
  frame?: string;

  /** 是否是模板 0 1 */
  isTemplate?: number;

  /** 模板分类标签 */
  templateTab?: string;

  /** 模板类型 */
  templateType?: 'app' | 'web';

  /** 正在跟进 */
  isFollowed?: boolean;

  /** 已删除 */
  isDeleted?: boolean;

  /** 是否是模块 */
  isModule?: boolean;

  /** 资源归属 */
  belong?: BelongType;

  /** 文档类型 */
  type?: LcDocument['type'];

  /** 是否加载源码 */
  source?: boolean;

  /** 列表查询则过滤多余字段 */
  queryList?: boolean;

  /** 是否有画布 */
  haveCanvas?: boolean;

  /** 是否加载引用的相关文档 */
  getImport?: boolean;

  /** 模式 */
  mode?: 'design' | 'runner';
}

export class ApiEditorInstallModuleReqDto {
  /**
   * 项目ID
   */
  projectId: string;
  /**
   * 模块ID
   */
  moduleIds: string[];

  /**
   * 是否删除已存在的模块
   */
  isDeleteExist?: boolean;
}

export class ApiEditorInstallModuleResDto {
  assets: LcProject['assets'];
  modules: LcProject['modules'];
}

export class ApiEditorGetResDto extends QueryListVo {
  data: LcProject[];
}

export class ApiEditorDetailResDto {
  project: LcProject;
  documents: LcDocument[];
  componentDocs: LcDocument[];
}

export class ApiEditorGetDocumentsResDto {
  documents: LcDocument[];
  componentDocs: LcDocument[];
}

export class ApiEditorDocumentsResDto {
  documents: LcDocument[];
  componentDocs: LcDocument[];
}

export class ApiEditorGetDocumentReqDto extends QueryOptionsDto {
  projectId?: string;

  /**
   * 使用ID获取
   */
  _id?: string;

  /**
   * 使用ID获取
   */
  _ids?: string[];

  /**
   * 根据文件名获取指定页面
   */
  fileName?: string;

  frame?: string;

  share?: boolean;

  branch?: string;

  /**
   * 根据文件名获取指定页面（多）
   */
  fileNames?: string[];

  /**
   * 文件夹
   */
  folders?: string[];

  type?: 'Page' | 'Component' | 'Block';

  trade?: string;
  childTrade?: string;
  scene?: string;
  childScene?: string;

  keywords?: string;

  /**
   * 返回源码
   */
  source?: boolean;

  /**
   * 资源归属
   */
  belong?: BelongType;

  /**
   * 团队ID
   */
  teamId?: number;

  /**
   * 仅返回某个时间点更新后的文档
   */
  afterTime?: number;
}

export class ApiEditorGetDocumentResDto extends QueryListVo {
  data: LcDocument[];
}

export class ApiEditorExportReqDto {
  /**
   * 仅导出指定页面源码
   */
  _id?: string;
}

export class ApiEditorTransformCodeReqDto {
  code: string;
}

export class ApiEditorImportApiReqDto {
  typeItem: ITypeEntity;
}

export class ApiEditorCloneProjectReqDto {
  /**
   * 项目模板ID
   */
  templateId?: string;

  /**
   * 项目ID
   */
  projectId?: string;
}

export class ApiEditorGetHistoryReqDto {
  docId?: string;
  projectId?: string;
}

export class ApiEditorGetHistoryResDto {
  data: LcDocumentBackup[];
}

// 版本控制相关 DTO
export class ApiEditorCreateCommitReqDto {
  /** 项目ID */
  projectId: string;

  /** 分支名称 */
  branch: string;

  /** 提交信息 */
  message: string;

  /** 文档变更 */
  documents: any;

  /** 类型变更 */
  types: any;
}

export class ApiEditorGetCommitHistoryReqDto {
  /** 项目ID */
  projectId: string;

  /** 分支名称 */
  branch?: string;

  /** 开始时间 */
  startTime?: number;

  /** 结束时间 */
  endTime?: number;

  /** 每页数量 */
  pageSize?: number;

  /** 页码 */
  page?: number;
}

export class ApiEditorCommitHistoryResDto {
  /** 提交列表 */
  list: Array<{
    _id: string;
    projectId: string;
    branch: string;
    message: string;
    userId: number;
    timestamp: number;
    changes: {
      documents: Array<{
        _id: string;
        content: string;
        version: number;
      }>;
      types: Array<{
        _id: string;
        content: string;
        version: number;
      }>;
    };
  }>;

  /** 总数 */
  total: number;
}

export class ApiEditorBranchOperationReqDto {
  /** 项目ID */
  projectId: string;

  /** 操作类型 */
  action: 'create' | 'merge' | 'delete' | 'switch';

  /** 分支名称 */
  branch: string;

  /** 目标分支(合并时需要) */
  targetBranch?: string;
}

export class ApiEditorTagOperationReqDto {
  /** 项目ID */
  projectId: string;

  /** 操作类型 */
  action: 'create' | 'delete';

  /** 标签名称 */
  name: string;

  /** 提交ID */
  commitId: string;

  /** 标签描述 */
  description?: string;
}

export class ApiEditorCompareFilesReqDto {
  /** 项目ID */
  projectId: string;

  /** 源提交ID */
  sourceCommitId: string;

  /** 目标提交ID */
  targetCommitId: string;

  /** 文件ID列表 */
  fileIds: string[];
}

export class ApiEditorFileDiffResDto {
  /** 文件差异列表 */
  list: Array<{
    fileId: string;
    fileName: string;
    diff: Array<{
      type: 'add' | 'delete' | 'modify';
      content: string;
      lineNumber: number;
    }>;
  }>;
}

export class ApiEditorRollbackReqDto {
  /** 项目ID */
  projectId: string;

  /** 提交ID */
  commitId: string;

  /** 回滚说明 */
  message: string;
}

export class ApiEditorPublishModuleReqDto {
  /** 项目ID */
  projectId: string;

  /** 模块名称 */
  moduleName: string;

  /** 版本号 */
  version: string;

  /** 发布说明 */
  description: string;

  /** 标签ID */
  tagId: string;
}

export class ApiEditorInstallModuleVersionReqDto {
  /** 项目ID */
  projectId: string;

  /** 模块名称 */
  moduleName: string;

  /** 版本号 */
  version: string;
}

export interface ApiEditorBranchListResDto {
  branches: Array<{
    name: string;
    latestCommit: {
      id: string;
      message: string;
      timestamp: number;
    };
    creator: {
      id: number;
      name: string;
    };
    createTime: number;
  }>;
}

export interface ApiEditorTagListResDto {
  tags: Array<{
    name: string;
    type: string;
    commit: {
      id: string;
      message: string;
    };
    meta?: {
      version?: string;
      moduleId?: string;
      description?: string;
    };
    creator: {
      id: number;
      name: string;
    };
    createTime: number;
  }>;
}

/**
 * 项目资源比较请求参数
 */
export interface ApiEditorCompareProjectFoldersReqDto {
  title?: string;
  sourceProjectId: string;
  targetProjectId: string;
  sourceFolder?: string;
  targetFolder?: string;
  mode?: CompareMode;
  options?: {
    compareConfig?: boolean;
    compareAssets?: boolean;
    fileTypes?: Array<'document' | 'type'>;
    fileIds?: string[];
    includeDeleted?: boolean;
  };
}

/**
 * 资源变更统计信息
 */
export interface ResourceChangeSummary {
  /** 新增的资源数量 */
  added: number;
  /** 修改的资源数量 */
  modified: number;
  /** 删除的资源数量 */
  deleted: number;
  /** 远程删除的资源数量 */
  remoteDeleted: number;
  /** 远程更新的资源数量 */
  remoteUpdated: number;
  /** 本地修改的资源数量 */
  localModified: number;
  /** 冲突的资源数量 */
  conflicts: number;
}

export interface ProjectResourceChange {
  /** 项目基础信息变更 */
  project: {
    /** 基础配置变更 */
    basic?: ResourceChange<
      Pick<LcProject, 'title' | 'description' | 'type' | 'icon' | 'screenshot'> & {
        version?: number;
      }
    >;
    /** 项目配置变更 */
    config?: ResourceChange<Pick<LcProject, 'envInfo' | 'appConfig'> & { version?: number }>;
    /** 项目资源变更 */
    assets?: ResourceChange<
      Pick<LcProject, 'assets' | 'packages' | 'themes'> & { version?: number }
    >;
  };
  /** 文档变更记录，key 为文档ID */
  documents: Record<string, ResourceChange<LcDocument>>;
  /** 类型变更记录，key 为类型ID */
  types: Record<string, ResourceChange<ITypeEntity>>;
}

/**
 * 项目资源比较结果
 */
export interface ApiEditorCompareProjectFoldersResDto {
  /** 源项目信息 */
  sourceProject: {
    /** 项目基本信息 */
    project: Pick<LcProject, '_id' | 'title' | 'description' | 'type' | 'teamId'>;
    /** 项目文件夹路径 */
    folder?: string;
  };
  /** 目标项目信息 */
  targetProject: {
    /** 项目基本信息 */
    project: Pick<LcProject, '_id' | 'title' | 'description' | 'type' | 'teamId'>;
    /** 项目文件夹路径 */
    folder?: string;
  };
  /** 变更详情 */
  changes: ProjectResourceChange;
  /** 变更统计 */
  summary: {
    /** 项目变更统计 */
    project: {
      /** 基础信息是否有变更 */
      basic: boolean;
      /** 配置是否有变更 */
      config: boolean;
      /** 资源是否有变更 */
      assets: boolean;
    };
    /** 文档变更统计 */
    documents: ResourceChangeSummary;
    /** 类型变更统计 */
    types: ResourceChangeSummary;
  };
  /** 比较范围 */
  scope?: {
    /** 是否包含项目基础信息 */
    basic?: boolean;
    /** 是否包含项目配置 */
    config?: boolean;
    /** 是否包含项目资源 */
    assets?: boolean;
    /** 是否包含文档 */
    documents?: boolean;
    /** 是否包含类型 */
    types?: boolean;
  };
}

/**
 * 资源变更类型
 */
export type ResourceChangeAction = 'add' | 'modify' | 'delete';

/**
 * 资源来源类型
 */
export enum ResourceOrigin {
  LOCAL = 'LOCAL',
  REMOTE = 'REMOTE',
  MODULE = 'MODULE',
}

/**
 * 资源状态
 */
export enum ResourceStatus {
  NORMAL = 'NORMAL',
  REMOTE_DELETED = 'REMOTE_DELETED',
  REMOTE_UPDATED = 'REMOTE_UPDATED',
  LOCAL_MODIFIED = 'LOCAL_MODIFIED',
  CONFLICT = 'CONFLICT',
}

/**
 * 资源变更记录
 */
export interface ResourceChange<T extends { version?: number }> {
  /** 变更类型：新增、修改、删除 */
  action: ResourceChangeAction;
  /** 资源在项目中的路径 */
  path: string;
  /** 资源版本号 */
  version: number;
  /** 资源来源信息 */
  origin: {
    /** 来源类型 */
    type: ResourceOrigin;
    /** 来源项目ID */
    projectId: string;
    /** 最后同步时间 */
    lastSyncTime?: number;
  };
  /** 资源状态 */
  status: ResourceStatus;
  /** 变更前后的内容对比 */
  diff: {
    /** 变更前的内容，对于新增的资源为空 */
    before?: T;
    /** 变更后的内容，对于删除的资源为空 */
    after?: T;
  };
  timestamp?: number;
}
